home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / ODF Release 3 / ODFDev / Form / Sources / Content.cpp < prev    next >
Encoding:
Text File  |  1996-12-16  |  13.6 KB  |  469 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                Content.cpp
  4. //    Release Version:    $ ODF 3 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "Form.hpp"
  11.  
  12. #ifndef CONTENT_H
  13. #include "Content.h"
  14. #endif
  15.  
  16. #ifndef DEFINES_K
  17. #include "Defines.k"
  18. #endif
  19.  
  20. // ----- Framework Includes -----
  21.  
  22. #ifndef FWPART_H
  23. #include "FWPart.h"
  24. #endif
  25.  
  26. #ifndef FWFRAME_H
  27. #include "FWFrame.h"
  28. #endif
  29.  
  30. #ifndef FWKIND_H
  31. #include "FWKind.h"
  32. #endif
  33.  
  34. #ifndef FWEDVIEW_H
  35. #include "FWEdView.h"
  36. #endif
  37.  
  38. #ifndef FWBUTTON_H
  39. #include "FWButton.h"
  40. #endif
  41.  
  42. #ifndef FWPOPUP_H
  43. #include "FWPopup.h"
  44. #endif
  45.  
  46. #ifndef FWSUSINK_H
  47. #include "FWSUSink.h"
  48. #endif
  49.  
  50. #ifndef FWSUUTIL_H
  51. #include "FWSUUtil.h"
  52. #endif
  53.  
  54. // ----- Foundation Includes -----
  55.  
  56. #ifndef FWSTREAM_H
  57. #include "FWStream.h"
  58. #endif
  59.  
  60.  
  61.  
  62. //========================================================================================
  63. // Runtime Information
  64. //========================================================================================
  65.  
  66. #ifdef FW_BUILD_MAC
  67. #pragma segment odfform
  68. #endif
  69.  
  70. //========================================================================================
  71. //    class CFormContent
  72. //========================================================================================
  73.  
  74. FW_DEFINE_CLASS_M2(CFormContent, FW_CContent, FW_MReceiver)
  75. FW_DEFINE_AUTO(CFormContent)
  76.  
  77. //----------------------------------------------------------------------------------------
  78. //    CFormContent::CFormContent
  79. //----------------------------------------------------------------------------------------
  80.  
  81. CFormContent::CFormContent(Environment* ev, FW_CPart* formPart) :
  82.     FW_CContent(ev, formPart),
  83.     fFirstName(),
  84.     fLastName(),
  85.     fMemberName(),
  86.     fEMailAddress(),
  87.     fComments(),
  88.     fSubscribeCheckboxState(1),
  89.     fBrowseMenuItem(0),
  90.     fOnlineMenuItem(0),
  91.     fWordOfMouthRadioState(1),
  92.     fHyperLinkRadioState(0),
  93.     fMacTechRadioState(0),
  94.     fYesRadioState(1),
  95.     fNoRadioState(0)
  96. {
  97. }
  98.  
  99. //----------------------------------------------------------------------------------------
  100. //    CFormContent::ExternalizeKind
  101. //----------------------------------------------------------------------------------------
  102.  
  103. void CFormContent::ExternalizeKind(Environment* ev,
  104.                                 ODStorageUnit* storageUnit,
  105.                                 FW_CKind* kind,
  106.                                 FW_StorageKinds storageKind,
  107.                                 FW_CPromise* promise,
  108.                                 FW_CCloneInfo* cloneInfo)
  109. {
  110. FW_UNUSED(storageKind);
  111. FW_UNUSED(promise);
  112. FW_UNUSED(cloneInfo);
  113.     if (kind->IsPartKind(ev))
  114.     {            
  115.         FW_PStorageUnitSink sink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  116.         FW_CWritableStream stream(sink);
  117.         
  118.         FW_ControlValue obsolete = 0;
  119.         stream << fFirstName << fLastName << fMemberName << fEMailAddress << fComments
  120.             << fSubscribeCheckboxState << obsolete << obsolete << obsolete
  121.             << fBrowseMenuItem << fOnlineMenuItem
  122.             << fWordOfMouthRadioState << fHyperLinkRadioState << fMacTechRadioState
  123.             << obsolete/*fMagazineRadioState*/ << obsolete/*fOtherRadioState*/;
  124.  
  125.         FW_SUDeleteEndOfFocusedValue(ev, storageUnit);
  126.     }
  127. }
  128.  
  129. //----------------------------------------------------------------------------------------
  130. //    CFormContent::InternalizeKind
  131. //----------------------------------------------------------------------------------------
  132.  
  133. FW_Boolean CFormContent::InternalizeKind(Environment* ev,
  134.                                         ODStorageUnit* storageUnit,
  135.                                         FW_CKind* kind,
  136.                                         FW_StorageKinds storageKind,
  137.                                         FW_CCloneInfo* cloneInfo)
  138. {
  139. FW_UNUSED(cloneInfo);
  140.     FW_Boolean result = false;
  141.     
  142.     if (kind->IsPartKind(ev))
  143.     {
  144.         FW_PStorageUnitSink sink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  145.         FW_CReadableStream stream(sink);
  146.         
  147.         FW_ControlValue obsolete;
  148.         stream >> fFirstName >> fLastName >> fMemberName >> fEMailAddress >> fComments
  149.             >> fSubscribeCheckboxState
  150.             >> obsolete/*f14400RadioState*/ >> obsolete/*f28800RadioState*/ >> obsolete/*fFasterRadioState*/
  151.             >> fBrowseMenuItem >> fOnlineMenuItem
  152.             >> fWordOfMouthRadioState >> fHyperLinkRadioState >> fMacTechRadioState
  153.             >> obsolete/*fMagazineRadioState*/ >> obsolete/*fOtherRadioState*/;
  154.         
  155.         ExportToViews(ev, GetPart(ev)->GetLastActiveFrame(ev));
  156.         result = true;
  157.     }
  158.     else
  159.         FW_DEBUG_MESSAGE("CFormContent::InternalizeKind - Unknown type");
  160.         
  161.     if (result && storageKind != FW_kPartStorage)
  162.         GetPart(ev)->Changed(ev);
  163.         
  164.     return result;
  165. }
  166.  
  167. //----------------------------------------------------------------------------------------
  168. //    CFormContent::HandleNotification
  169. //----------------------------------------------------------------------------------------
  170.  
  171. void CFormContent::HandleNotification(Environment* ev, const FW_CNotification& notification)
  172. {
  173.     FW_MNotifier* notifier = notification.GetNotifier();
  174.     
  175.     switch (notification.GetMessage())
  176.     {
  177.         case FW_kChangedMsg:
  178.             {
  179.                 FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, notifier);
  180.                 FW_ASSERT(editView);
  181.                 GetEditViewText(ev, editView->GetFrame(ev), editView->GetViewID(ev));
  182.             }
  183.             break;
  184.         
  185.         case FW_kButtonPressedMsg:
  186.         case FW_kRadioClusterMsg:
  187.         case FW_kPopupClickedMsg:
  188.             {
  189.                 FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, notifier);
  190.                 FW_ASSERT(control);
  191.                 GetControlValue(ev, control->GetFrame(ev), control->GetViewID(ev));
  192.             }
  193.             break;
  194.             
  195.         default:
  196.             break;
  197.     }    
  198. }
  199.  
  200.  
  201. //----------------------------------------------------------------------------------------
  202. //    CFormContent::AddViewInterests
  203. //----------------------------------------------------------------------------------------
  204.  
  205. void CFormContent::AddViewInterests(Environment* ev, FW_CFrame* frame)
  206. {
  207.     FW_CEditView*     editView;
  208.     FW_CButton*     buttonView;
  209.     FW_CPopupMenu*    popupMenu;
  210.     
  211.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kFirstNameEdViewID));
  212.     FW_ASSERT(editView);
  213.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  214.  
  215.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kLastNameEdViewID));
  216.     FW_ASSERT(editView);
  217.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  218.  
  219.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kMemberNameEdViewID));
  220.     FW_ASSERT(editView);
  221.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  222.  
  223.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kEMailEdViewID));
  224.     FW_ASSERT(editView);
  225.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  226.  
  227.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kCommentsEdViewID));
  228.     FW_ASSERT(editView);
  229.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  230.  
  231.     popupMenu = FW_DYNAMIC_CAST(FW_CPopupMenu, frame->FindViewByID(ev, kBrowseTimePopupID));
  232.     FW_ASSERT(popupMenu);
  233.     AddInterest(FW_CInterest(popupMenu, FW_kPopupClickedMsg));
  234.     
  235.     popupMenu = FW_DYNAMIC_CAST(FW_CPopupMenu, frame->FindViewByID(ev, kOnlineTimePopupID));
  236.     FW_ASSERT(popupMenu);
  237.     AddInterest(FW_CInterest(popupMenu, FW_kPopupClickedMsg));
  238.  
  239.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kWordOfMouthRadioID));
  240.     FW_ASSERT(buttonView);
  241.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  242.  
  243.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kHyperLinkRadioID));
  244.     FW_ASSERT(buttonView);
  245.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  246.  
  247.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kMacTechRadioID));
  248.     FW_ASSERT(buttonView);
  249.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  250.     
  251.     // we're not interested in the state of the yes/no buttons...yes is always
  252.     // on and no is always off.
  253. }
  254.  
  255. //----------------------------------------------------------------------------------------
  256. //    CFormContent::ImportFromViews
  257. //----------------------------------------------------------------------------------------
  258.  
  259. void CFormContent::ImportFromViews(Environment* ev, FW_CFrame* frame)
  260. {
  261.     FW_ASSERT(false);
  262.     FW_ASSERT(frame != NULL);
  263.         // may not have views if the frame is in limbo and views have been deleted
  264.     if (frame->HasSubViews(ev))
  265.     {
  266.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  267.         GetEditViewText(ev, frame, kLastNameEdViewID);
  268.         GetEditViewText(ev, frame, kMemberNameEdViewID);
  269.         GetEditViewText(ev, frame, kEMailEdViewID);
  270.         GetEditViewText(ev, frame, kCommentsEdViewID);
  271.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  272.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  273.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  274.  
  275.         GetControlValue(ev, frame, kSubscribeCheckID);
  276.         GetControlValue(ev, frame, kBrowseTimePopupID);
  277.         GetControlValue(ev, frame, kOnlineTimePopupID);
  278.         GetControlValue(ev, frame, kWordOfMouthRadioID);
  279.         GetControlValue(ev, frame, kHyperLinkRadioID);
  280.         GetControlValue(ev, frame, kMacTechRadioID);
  281.         // we don't import the yes/no buttons...their values don't change
  282.     }
  283. }
  284.  
  285. //----------------------------------------------------------------------------------------
  286. //    CFormContent::ExportToViews
  287. //----------------------------------------------------------------------------------------
  288.  
  289. void CFormContent::ExportToViews(Environment* ev, FW_CFrame* frame)
  290. {
  291.     if (frame && frame->HasSubViews(ev))
  292.     {
  293.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  294.         SetEditViewText(ev, frame, kLastNameEdViewID);
  295.         SetEditViewText(ev, frame, kMemberNameEdViewID);
  296.         SetEditViewText(ev, frame, kEMailEdViewID);
  297.         SetEditViewText(ev, frame, kCommentsEdViewID);
  298.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  299.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  300.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  301.  
  302.         SetControlValue(ev, frame, kSubscribeCheckID);
  303.         SetControlValue(ev, frame, kBrowseTimePopupID);
  304.         SetControlValue(ev, frame, kOnlineTimePopupID);
  305.         SetControlValue(ev, frame, kWordOfMouthRadioID);
  306.         SetControlValue(ev, frame, kHyperLinkRadioID);
  307.         SetControlValue(ev, frame, kMacTechRadioID);
  308.         SetControlValue(ev, frame, kYesRadioID);
  309.         SetControlValue(ev, frame, kNoRadioID);
  310.     }
  311. }
  312.  
  313. //----------------------------------------------------------------------------------------
  314. //    CFormContent::GetEditViewText
  315. //----------------------------------------------------------------------------------------
  316.  
  317. void CFormContent::GetEditViewText(Environment* ev, 
  318.                                 FW_CFrame* frame,
  319.                                 ODID viewID)
  320. {
  321.     FW_CString* string = ViewIDToStringAddress(viewID);    
  322.     FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, viewID));
  323.     FW_ASSERT(editView);
  324.     
  325.     FW_CString editViewText = editView->GetText(ev);
  326.     if (*string != editViewText)
  327.     {
  328.         *string = editViewText;
  329.         GetPart(ev)->Changed(ev);
  330.     }
  331. }
  332.  
  333. //----------------------------------------------------------------------------------------
  334. //    CFormContent::SetEditViewText
  335. //----------------------------------------------------------------------------------------
  336.  
  337. void CFormContent::SetEditViewText(Environment* ev,
  338.                                 FW_CFrame* frame,
  339.                                 ODID viewID)
  340. {
  341.     FW_CString* string = ViewIDToStringAddress(viewID);
  342.     FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, viewID));
  343.     FW_ASSERT(editView);
  344.     editView->SetText(ev, *string);
  345. }
  346.  
  347. //----------------------------------------------------------------------------------------
  348. //    CFormContent::GetControlValue
  349. //----------------------------------------------------------------------------------------
  350.  
  351. void CFormContent::GetControlValue(Environment* ev,
  352.                                 FW_CFrame* frame,
  353.                                 ODID viewID)
  354. {
  355.     FW_ControlValue* value = ViewIDToControlValueAddress(viewID);
  356.     FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, frame->FindViewByID(ev, viewID));
  357.     FW_ASSERT(control);
  358.     FW_ControlValue controlViewValue = control->GetValue(ev);
  359.     
  360.     if (*value != controlViewValue)
  361.     {
  362.         *value = controlViewValue;
  363.         GetPart(ev)->Changed(ev);
  364.     }
  365. }
  366.  
  367. //----------------------------------------------------------------------------------------
  368. //    CFormContent::SetControlValue
  369. //----------------------------------------------------------------------------------------
  370.  
  371. void CFormContent::SetControlValue(Environment* ev,
  372.                                 FW_CFrame* frame,
  373.                                 ODID viewID)
  374. {
  375.     FW_ControlValue value = *(ViewIDToControlValueAddress(viewID));
  376.     FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, frame->FindViewByID(ev, viewID));
  377.     FW_ASSERT(control);
  378.     control->SetValue(ev, value);
  379. }
  380.  
  381. //----------------------------------------------------------------------------------------
  382. //    CFormContent::ViewIDToStringAddress
  383. //----------------------------------------------------------------------------------------
  384.  
  385. FW_CString* CFormContent::ViewIDToStringAddress(ODID viewID)
  386. {
  387.     FW_CString* string;
  388.     
  389.     switch (viewID)
  390.     {
  391.         case kFirstNameEdViewID:
  392.             string = &fFirstName;
  393.             break;
  394.         
  395.         case kLastNameEdViewID:
  396.             string = &fLastName;
  397.             break;
  398.             
  399.         case kMemberNameEdViewID:
  400.             string = &fMemberName;
  401.             break;
  402.             
  403.         case kEMailEdViewID:
  404.             string = &fEMailAddress;
  405.             break;
  406.             
  407.         case kCommentsEdViewID:
  408.             string = &fComments;
  409.             break;
  410.             
  411.         default:
  412.             string = NULL;
  413.             break;
  414.     }
  415.     
  416.     FW_ASSERT(string);
  417.     return string;
  418. }
  419.  
  420. //----------------------------------------------------------------------------------------
  421. //    CFormContent::ViewIDToControlValueAddress
  422. //----------------------------------------------------------------------------------------
  423.  
  424. FW_ControlValue* CFormContent::ViewIDToControlValueAddress(ODID viewID)
  425. {    
  426.     FW_ControlValue* value;
  427.     
  428.     switch (viewID)
  429.     {
  430.         case kSubscribeCheckID:
  431.             value = &fSubscribeCheckboxState;
  432.             break;
  433.             
  434.         case kBrowseTimePopupID:
  435.             value = &fBrowseMenuItem;
  436.             break;
  437.             
  438.         case kOnlineTimePopupID:
  439.             value = &fOnlineMenuItem;
  440.             break;
  441.             
  442.         case kWordOfMouthRadioID:
  443.             value = &fWordOfMouthRadioState;
  444.             break;
  445.             
  446.         case kHyperLinkRadioID:
  447.             value = &fHyperLinkRadioState;
  448.             break;
  449.             
  450.         case kMacTechRadioID:
  451.             value = &fMacTechRadioState;
  452.             break;
  453.             
  454.         case kYesRadioID:
  455.             value = &fYesRadioState;
  456.             break;
  457.             
  458.         case kNoRadioID:
  459.             value = &fNoRadioState;
  460.             break;
  461.             
  462.         default:
  463.             value = NULL;
  464.             break;
  465.     }
  466.     FW_ASSERT(value);
  467.     return value;
  468. }
  469.